﻿/** 
 * 主窗口类的构造方法。
 */
function MainWindow() {
    const mButtonMusic = document.getElementById("IDC_BUTTON_MUSIC")            // "音乐"按钮
    const mButtonPause = document.getElementById("IDC_BUTTON_PAUSE")            // "暂停"按钮
    var mGame = null                                                            // 游戏
    const mLabelDifficulty = document.getElementById("IDC_LABEL_DIFFICULTY")    // 难度值标签
    const mLabelScore = document.getElementById("IDC_LABEL_SCORE")              // 得分值标签

    // 设置文档标题
    document.title = IDS_APP_NAME[LANG]

    // 添加窗口失去焦点事件监听者
    window.onblur = onLostFocus

    // 设置按键事件监听者
    document.onkeydown = onKeyPressed

    // 添加难度增加事件监听者
    document.addEventListener(Const.UM_DIFFICULTY_UP, onDifficultyUp)

    // 添加得分事件监听者
    document.addEventListener(Const.UM_SCORE, onScore)

    // 添加游戏结束事件监听者
    document.addEventListener(Const.UM_GAME_OVER, onGameOver)

    // 设置主窗口背景
    document.getElementById("IDC_MAIN_WINDOW").style.backgroundImage = Const.IMAGE_PATH
    
    // 设置操作说明
    document.getElementById("IDC_GROUPBOX_HELP").innerHTML = IDS_HELP[LANG]
    document.getElementById("IDC_LABEL_HELP").innerHTML = IDS_HELP_TEXT[LANG]
    
    // 设置所有按钮的单击事件
    const buttonStart = document.getElementById("IDC_BUTTON_START")
    buttonStart.onclick = onButtonStartClicked
    mButtonPause.onclick = onButtonPauseClicked
    mButtonMusic.onclick = onButtonMusicClicked

    // 设置所有标签的文字
    mLabelDifficulty.innerHTML = IDS_DIFFICULTY[LANG] + 1
    mLabelScore.innerHTML = IDS_SCORE[LANG] + 0

    // 创建游戏区域
    const gameBoard = new GameBoard("IDC_GAME_BOARD")

    // 创建预览区域
    const preview = new GameBoard("IDC_PREVIEW")

    // 创建游戏
    mGame = new Game(gameBoard, gameBoard.getDrawer(), preview, preview.getDrawer())

    /**
     * "播放音乐"按钮的单击响应方法。
     */
    function onButtonMusicClicked() {
        const playingMusic = mGame.playMusic()
        if (playingMusic) {
            mButtonMusic.style.backgroundImage = Const.BUTTON_MUSIC_STOP_IMAGE_PATH
        } else {
            mButtonMusic.style.backgroundImage = Const.BUTTON_MUSIC_PLAY_IMAGE_PATH
        }
    }

    /**
     * "暂停"按钮的单击响应方法。
     */
    function onButtonPauseClicked() {
        if (mButtonPause.disabled) {
            return
        }

        mGame.pause()
        const status = mGame.getStatus()
        if (status == GameStatus.PAUSED) {
            mButtonPause.style.backgroundImage = Const.BUTTON_RESUME_IMAGE_PATH
        } else if (status == GameStatus.PLAYING) {
            mButtonPause.style.backgroundImage = Const.BUTTON_PAUSE_IMAGE_PATH
        }
    }

    /**
     * "开始"按钮的单击响应方法。
     */
    function onButtonStartClicked() {
        // 游戏开始
        mGame.start()

        // 设置按钮状态
        mButtonPause.removeAttribute("disabled")

        // 设置按钮图片
        mButtonPause.style.backgroundImage = Const.BUTTON_PAUSE_IMAGE_PATH

        // 设置状态栏文字
        mLabelDifficulty.innerHTML = IDS_DIFFICULTY[LANG] + 1
        mLabelScore.innerHTML = IDS_SCORE[LANG] + 0
    }

    /**
     * 难度增加事件的响应方法。
     * @param e 事件相关信息
     */ 
    function onDifficultyUp(e) {
        mLabelDifficulty.innerHTML = IDS_DIFFICULTY[LANG] + e.arg1
    }

    /**
     * 游戏结束事件的响应方法。
     * @param e 事件相关信息
     */
    function onGameOver(e) {
        const isWon = e.arg1
        if (isWon) {
            window.alert(IDS_WON[LANG])
        } else {
            window.alert(IDS_LOST[LANG])
        }
        mButtonPause.style.backgroundImage = Const.BUTTON_PAUSE_DISABLED_IMAGE_PATH
        mButtonPause.setAttribute("disabled", true)
    }

    /**
     * 按键事件的响应方法。
     * @param e 事件相关信息
     */
    function onKeyPressed(e) {
        mGame.onKeyPressed(e.keyCode)
    }

    /**
     * 窗口失去焦点事件的响应方法。
     * @param e 事件相关信息
     */
    function onLostFocus(e) {
        const status = mGame.getStatus()
        if (status == GameStatus.PLAYING) {
            onButtonPauseClicked()
        }
    }

    /**
     * 得分事件的响应方法。
     * @param e 事件相关信息
     */
    function onScore(e) {
        mLabelScore.innerHTML = IDS_SCORE[LANG] + e.arg1
    }
}
